package io.dy.prepare;

import cn.hutool.core.util.RandomUtil;
import org.junit.Test;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
/**
 * @author : dmj
 * @date: 2024/12/18 2:54 下午
 * @description: 准备批量数据集
 *
 * id(主键ID),    time(下单时间),   order_code(订单编号),    user_id(用户ID),     price(价格),    brand(品牌),    item_id(商品ID)
 *
 */
public class PrepareData {

    @Test
    public void write(){
        //获取所有品牌
        Random random = new Random();
        List<String> brandList = brandList(10000);
        try(FileWriter fw = new FileWriter("/Users/zhayuwen/work/dyDate/data.txt")){
            BufferedWriter buffer = new BufferedWriter(fw);
            for (int i = 0; i < 1000000; i++) {
                String line = String.join(",", Arrays.asList(
                        i + "",
                        generateData(2024).toString(),
                        generateOrderCode("OC"),
                        random.nextInt(1000) + "",
                        random.nextDouble() * 10000d + "",
                        brandList.get(random.nextInt(brandList.size())),
                        random.nextInt(10000) + ""
                ));
                buffer.write(line);
                buffer.newLine();
            }
            buffer.close();
            //Queue
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static final String[] BRAND = {""};

    /**
     * 生成某年内的随机时间
     * @param year
     * @return
     */
    public static Date generateData(int year){
        Random random = new Random();
        int M = random.nextInt(11) + 1;
        int d;
        if(M == 1 || M == 3 || M == 5 || M == 7 || M == 8 || M == 10 || M == 12){
            d = random.nextInt(30) + 1;
        }else{
            d = random.nextInt(29) + 1;
        }
        int h = random.nextInt(24);
        int m = random.nextInt(60);
        int s = random.nextInt(60);
        LocalDateTime dateTime = LocalDateTime.of(year, M, d, h, m, s);
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zonedDateTime = dateTime.atZone(zoneId);
        return Date.from(zonedDateTime.toInstant());
    }

    public static String generateOrderCode(String prefix){
        String random = RandomUtil.randomNumbers(14);
        return prefix + random;
    }

    @Test
    public void testGenerateData(){
        for (int i = 1; i <= 10; i++) {
            System.out.println(generateData(2024).toString());
        }
    }

    @Test
    public void testGenerateOrderCode(){
        for (int i = 1; i <= 10; i++) {
            System.out.println(generateOrderCode("OC"));
        }
    }

    public static final List<String> words = Arrays.asList(
            "权", "羽", "月", "蒙", "朋", "略", "奎", "韵", "嘉", "方",
            "紫", "淼", "姗", "春", "炳", "纯", "麒", "彩", "洺", "顺",
            "凝", "宣", "辰", "诒", "家", "川", "恒", "谨", "可", "山",
            "璟", "棋", "丞", "雪", "晔", "献", "岩", "莲", "友", "振",
            "璐", "廷", "佩", "言", "学", "焘", "选", "昌", "俪", "洪",
            "章", "诗", "厚", "承", "雨", "儒", "珑", "芷", "歌", "旭",
            "生", "喜", "茂", "臻", "裕", "津", "华", "健", "声", "励",
            "菁", "佳", "勋", "萍", "汝", "勤", "梦", "跃", "雄", "若",
            "连", "毓", "霖", "霏", "冠", "菊", "芸", "崊", "聪", "育",
            "建", "和", "敬", "帆", "湾", "谋", "晨", "全", "偌", "靓",
            "雷", "骄", "继", "钊", "卫", "颖", "世", "显", "珊", "晴",
            "优", "函", "苒", "保", "阳", "儿", "莹", "映", "展", "北",
            "鹏", "琪", "标", "虹", "巧", "锋", "贤", "佚", "洁", "芳",
            "允", "康", "麟", "革", "与", "好", "巩", "玲", "道", "功",
            "泓", "冬", "孟", "珺", "渲", "瑾", "吉", "碧", "祥", "蔚",
            "露", "畅", "邦", "孝", "筱", "沛", "礼", "渺", "谱", "燕",
            "才", "岚", "照", "男", "珠", "婧", "政", "隆", "海", "开",
            "立", "骅", "谊", "美", "仪", "艳", "然", "为", "菡", "禾",
            "淇", "忻", "融", "爱", "勇", "韬", "尚", "忠", "理", "朝",
            "城", "启", "钧", "萱", "毅", "百", "荣", "长", "莉", "舒",
            "天", "黎", "罡", "昊", "万", "明", "曼", "婉", "娇", "传",
            "帅", "炜", "奇", "灿", "艺", "鲁", "梅", "纪", "怀", "营",
            "航", "容", "慧", "少", "骏", "希", "培", "申", "蓓", "国",
            "会", "昕", "丰", "旻", "汉", "巍", "彦", "兵", "垒", "潞",
            "翰", "清", "军", "伦", "冰", "诚", "绍", "同", "涛", "祺",
            "剑", "钦", "桂", "朗", "平", "涵", "誉", "贵", "琴", "棠",
            "凯", "臣", "志", "妹", "珮", "金", "焕", "加", "卉", "力",
            "钢", "备", "寿", "灵", "基", "娆", "凤", "子", "任", "中",
            "磊", "升", "曦", "安", "光", "雯", "如", "风", "定", "西",
            "琳", "济", "向", "发", "湘", "英", "源", "星", "非", "迅",
            "雅", "洋", "秀", "捷", "丛", "心", "雁", "进", "科", "望",
            "登", "智", "其", "波", "滔", "娴", "静", "真", "群", "伟",
            "锐", "凡", "枫", "桐", "怡", "倩", "盛", "竹", "珍", "时",
            "豪", "议", "亿", "斌", "璇", "珂", "洲", "琦", "宪", "漫",
            "堂", "君", "瀚", "兆", "常", "宁", "双", "笑", "先", "泰",
            "年", "有", "业", "溓", "瑜", "茜", "睿", "益", "泉", "涓",
            "蓉", "浩", "贝", "红", "泽", "晓", "延", "劲", "田", "逸",
            "影", "惠", "玟", "博", "蓝", "兰", "骁", "思", "玉", "克",
            "根", "伊", "彬", "小", "润", "敖", "牧", "皓", "江", "丽",
            "伯", "南", "盈", "彤", "馨", "萌", "鸿", "叶", "达", "沁",
            "晋", "品", "云", "采", "齐", "忆", "悦", "森", "瑷", "景",
            "腾", "晖", "耀", "威", "卿", "朦", "广", "镇", "依", "至",
            "石", "菏", "媛", "之", "亦", "起", "义", "梓", "松", "坤",
            "素", "芬", "赏", "杰", "昭", "丹", "材", "韦", "滨", "俊",
            "咏", "峰", "利", "轩", "香", "震", "名", "扬", "晗", "熙",
            "妮", "玮", "潇", "婷", "欣", "琛", "卓", "谦", "大", "彪"
    );

    /**
     * 生成品牌名称
     * @return
     */
    public static List<String> brandList(int count){
        List<String> brandList = new ArrayList<>();
        Random random = new Random();
        int size = words.size();
        for (int i = 0; i < count; i++) {
            String name;
            if((i & 1) == 0){
                name = words.get(random.nextInt(size)) + words.get(random.nextInt(size)) + words.get(random.nextInt(size));
            }else{
                name = words.get(random.nextInt(size)) + words.get(random.nextInt(size));
            }
            brandList.add(name);
        }
        return brandList;
    }
}
